4.9 Strategy(策略)
有个成语叫“锦囊妙计”,用于形容非常不错的主意。这个成语应该是源自古代的某个谋士给他老板的建议,古人喜欢讲求形式,写好的文件资料总是喜欢找些高档的布包或是匣子来包装一下,他认为文件越有价值那么外包装也就必须要更有价值看上去更高档的东西才行。
“锦囊妙计”的概念早已深入我们日常生活中了,不论是古代题材的军事篇还是古装RPG电脑游戏,只要是取材于中华文化的,那么就少不了“锦囊妙计”的影子。常常会有这样的情景,一个人神秘兮兮地把一个布袋子交给另一个人然后庄重而有低声地告诉他:“你到了嘉峪关就打开里面的第一个锦囊,到了山海关就打开第二个,到了美国大使馆再打开第三个,保你出国留学畅通无阻!”拿到布袋的人怀着无比敬仰的心情对着那个人发出一声长长的感叹:“哦……!”那个人则大手一挥,这时候从门帘后面钻出个跑龙套的群众演员,端着一个漆木盘子,盘子里有两个酒杯和一个酒壶,二人各自端起一杯,第一个人这时候终于可以敞开嗓子说话了:“来!劝君更进一杯酒,西出阳关无故人啊!”
又是一套庸俗的电视剧,情节没什么意思,接下来我开始走神,把注意力集中到了那个人手里提着的那个布袋子。这个布袋子里装着的是什么呢?肯定是一串更小的布袋子;每个小布袋子里装的是什么呢?肯定是一封信;信上写的是什么呢?一定是在某种情况下该如何做才能够解决问题。我是个程序员,有一个职业病就是常常会不由自主地用程序设计的思维方式来思考现实生活中遇到的很多问题。假设我们把这个大布袋子看作是Facade模式的对外统一接口,它里面的各个小袋子就是各个子系统,而每个小袋子里装的解决问题的方法就是封装在各个子系统中的算法,也就是说,这个大袋子是一套算法的集合,用户可以根据实际情况的需要选择一个合适的算法来处理问题,这就是策略模式。
1: using System;
2:
3: namespace Autumoon.DesignPatterns.Strategy
4: {
5: public abstract class BrownBag
6: {
7: abstract public void Execute();
8: }
9:
10: public class FirstStrategy : BrownBag
11: {
12: override public void Execute()
13: {
14: Console.WriteLine("This is the first strategy.");
15: }
16: }
17:
18: public class SecondStrategy : BrownBag
19: {
20: override public void Execute()
21: {
22: Console.WriteLine("This is the second strategy.");
23: }
24: }
25:
26: public class Context
27: {
28: public BrownBag Bag { get; set; }
29:
30: public Context(BrownBag strategy)
31: {
32: this.Bag = strategy;
33: }
34:
35: public void ExecuteStrategy()
36: {
37: this.Bag.Execute();
38: }
39: }
40: }
希望那位想要出国留洋的仁兄能够如愿以偿!
1: static void Main(string[] args)
2: {
3: #region Strategy
4: FirstStrategy firstStrategy = new FirstStrategy();
5: Context context = new Context(firstStrategy);
6: context.ExecuteStrategy();
7:
8: SecondStrategy secondStrategy = new SecondStrategy();
9: context = new Context(secondStrategy);
10: context.ExecuteStrategy();
11: #endregion
12:
13: Console.ReadLine();
14: }